package 数据结构练习.summer;

import java.util.HashMap;
import java.util.Map;

public class day10 {
    //链表准备
    public class ListNode {
        int val;
        ListNode next;
        ListNode() {
        }
        ListNode(int val) {
            this.val = val;
        }
        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
    /*
    给你一个链表的头节点head，请你编写代码，反复删去链表中由 总和值为
    0 的连续节点组成的序列，直到不存在这样的序列为止。
    删除完毕后，请你返回最终结果链表的头节点。
    https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list
     */
    //copy,看不懂原理
    public ListNode removeZeroSumSublists(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        Map<Integer, ListNode> map = new HashMap<>();

        // 首次遍历建立 节点处链表和<->节点 哈希表
        // 若同一和出现多次会覆盖，即记录该sum出现的最后一次节点
        int sum = 0;
        for (ListNode d = dummy; d != null; d = d.next) {
            sum += d.val;
            map.put(sum, d);
        }

        // 第二遍遍历 若当前节点处sum在下一处出现了则表明两结点之间所有节点和为0 直接删除区间所有节点
        sum = 0;
        for (ListNode d = dummy; d != null; d = d.next) {
            sum += d.val;
            d.next = map.get(sum).next;
        }

        return dummy.next;
    }


    /*
    给你两个非空 的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。
请你将两个数相加，并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外，这两个数都不会以 0开头。
：https://leetcode.cn/problems/add-two-numbers
     */
    //因为有一个测试用例是十位数,所以没有办法通过测试
    public ListNode addTwoNumbers1(ListNode l1, ListNode l2) {
        //将两个链表表示的数求出,然后再相加
        int sum1=0,sum2=0;
        int temp=1;
        ListNode cur=l1;
        while(cur!=null){
            sum1+=temp* cur.val;
            temp*=10;
            cur=cur.next;
        }
        temp=1;
         cur=l2;
        while(cur!=null){
            sum2+=temp* cur.val;
            temp*=10;
            cur=cur.next;
        }
        int result=sum1+sum2;
        //存入
        ListNode head=new ListNode(0);
        if(result==0)return head;
        cur=head;
        while (result!=0){
            cur.next=new ListNode(result%10);
            cur=cur.next;
            result/=10;
        }
        return head.next;
    }


    //官方解
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int n1 = l1 != null ? l1.val : 0;
            int n2 = l2 != null ? l2.val : 0;
            int sum = n1 + n2 + carry;
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }

}
